/*

Miranda IM: the free IM client for Microsoft* Windows*

Copyright 2000-2007 Miranda ICQ/IM project, 
all portions of this codebase are copyrighted to the people 
listed in contributors.txt.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or ( at your option ) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
aLONG with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/
#pragma once

/***********************************************************************************************************
 * some compiler definitions
 ***********************************************************************************************************/

#define _WIN32_WINNT 0x0500
#define _WIN32_IE	 0x0500
#define WIN32_LEAN_AND_MEAN

#define _CRT_SECURE_NO_DEPRECATE 1
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 0

#pragma warning( disable:4995 )		// disable warning about strcpy, ... is old in VC2005
#pragma warning( disable:4996 )		// disable warning about strcpy, ... is old in VC2005

/***********************************************************************************************************
 * standard windows includes
 ***********************************************************************************************************/

#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <stdlib.h>
#include <commctrl.h>
#include <commdlg.h>
#include <shlobj.h>
#include <shlwapi.h>
#include <malloc.h>
#include <string>

/***********************************************************************************************************
 * Miranda IM SDK includes and macros
 ***********************************************************************************************************/

#define MIRANDA_VER 0x0800

#include <newpluginapi.h>	// This must be included first
#include <m_button.h>
#include <m_clist.h>
#include <m_cluiframes.h>
#include <m_database.h>
#include <m_genmenu.h>
#include <m_hotkeys.h>
#include <m_langpack.h>
#include <m_protomod.h>
#include <m_protosvc.h>
#include <m_options.h>
#include <m_contacts.h>
#include <m_utils.h>
#include <m_system.h>	// memory interface
#include <m_system_cpp.h>	// list template
#include <m_xml.h>	// XML API
#include <m_userinfo.h>
#include <win2k.h>

/***********************************************************************************************************
 * Used Plugins SDK includes and macros
 ***********************************************************************************************************/

#include "../Include/m_popup.h"
#include "../Include/m_metacontacts.h"
#include "../Include/m_magneticwindows.h"
#include "../Include/m_toolbar.h"
#include "../Include/m_toptoolbar.h"

#include <m_extraicons.h> //change this to match extraicons header location

/***********************************************************************************************************
 * UserInfoEx plugin includes and macros
 ***********************************************************************************************************/

#include "../Include/m_userinfoex.h"
#include "../Resource/resource.h"
#include "../iconpacks/icons.h"

#include "svcConstants.h"

#include "classContactQueue.h"

#include "utf8.h"
#include "mir_string.h"
#include "database.h"
#include "dlgMsgBox.h"
#include "icons.h"
#include "classMTime.h"
#include "classMAnnivDate.h"

#pragma intrinsic( memcmp, memcpy, memset, strcmp, strlen )

#define PtrIsValid( p )		( (( p )!=0 )&&( (( HANDLE )( p ) )!=INVALID_HANDLE_VALUE ) )
#define FREE( p )					{if( PtrIsValid( p ) ){free( ( VOID* )p );( p )=NULL;}}
#define MIR_DELETE( p )		{LPVOID ptr = ( LPVOID )( p );if( PtrIsValid( ptr ) ){delete( ptr );( ptr )=NULL;}}
#define MIR_FREE( p )			{if( PtrIsValid( p ) ){mir_free( ( VOID* )p );( p )=NULL;}}

#define GetUserData( p )		GetWindowLongPtr( ( p ), GWL_USERDATA )
#define SetUserData( p, l )	SetWindowLongPtr( ( p ), GWL_USERDATA, ( LONG_PTR ) ( l ) )

/***********************************************************************************************************
 * UserInfoEx global variables
 ***********************************************************************************************************/

typedef struct _MGLOBAL
{
	DWORD		mirandaVersion;					// mirandaVersion
	BOOLEAN		CanChangeDetails : 1;			// is service to upload own contact information for icq present?
	BOOLEAN		HaveCListExtraIcons : 1;		// are extra icons supported by current clist
	BOOLEAN		ExtraIconsServiceExist : 1;		// Extra Icon plugin / service exist
	BOOLEAN		TzIndexExist : 1;				// Win Reg has Timzone Index Info
	BOOLEAN		PopUpActionsExist : 1;			// Popup++ or MS_POPUP_REGISTERACTIONS exist
	BOOLEAN		Reserved3 : 1;					// reserved for later use
	BOOLEAN		Reserved4 : 1;					// reserved for later use
	BOOLEAN		Reserved5 : 1;					// reserved for later use
	LPCSTR		szMetaProto;

} MGLOBAL, *LPMGLOBAL;

extern HINSTANCE			ghInst;
extern MGLOBAL				myGlobals;
extern MM_INTERFACE		mmi;
extern LIST_INTERFACE	li;
extern UTF8_INTERFACE	utfi;

/***********************************************************************************************************
 * MIRANDA_CPP_PLUGIN_API
 ***********************************************************************************************************/

/**
 * These macros provide an interface for classes to use member
 * function as services and event hooks. 
 *
 * @note	This requires Miranda Core 0.8+!
 *
 **/
#define MIRANDA_CPP_PLUGIN_API(CCoreClass) \
	typedef INT ( __cdecl CCoreClass::*EVENTHOOK )( WPARAM, LPARAM );	\
	typedef INT ( __cdecl CCoreClass::*EVENTHOOKPARAM )( WPARAM, LPARAM, LPARAM ); \
	typedef INT ( __cdecl CCoreClass::*SERVICEFUNC )( WPARAM, LPARAM ); \
	typedef INT ( __cdecl CCoreClass::*SERVICEFUNCPARAM )( WPARAM, LPARAM, LPARAM ); \
	\
	HANDLE ThisHookEvent( const char* szEvent, EVENTHOOK pfnEvent ) \
	{	return ( HANDLE ) ::HookEventObj( szEvent, ( MIRANDAHOOKOBJ ) ( *( PVOID* ) &pfnEvent ), ( PVOID )this );} \
	HANDLE ThisHookEventParam( const char* szEvent, EVENTHOOKPARAM pfnEvent, LPARAM lParam ) \
	{	return ( HANDLE ) ::HookEventObjParam( szEvent, ( MIRANDAHOOKOBJPARAM ) ( *( PVOID* ) &pfnEvent ), ( PVOID )this, lParam );	} \
	\
	HANDLE ThisCreateService( const char* szService, SERVICEFUNC pfnService ) \
	{	return ( HANDLE ) ::CreateServiceFunctionObj( szService, ( MIRANDASERVICEOBJ ) ( *( PVOID* ) &pfnService ), ( PVOID )this );	} \
	HANDLE ThisCreateServiceParam( const char* szService, SERVICEFUNCPARAM pfnService, LPARAM lParam ) \
	{	return ( HANDLE ) ::CreateServiceFunctionObjParam( szService, ( MIRANDASERVICEOBJPARAM ) ( *( PVOID* ) &pfnService ), ( PVOID )this, lParam ); } \

/***********************************************************************************************************
 * UserInfoEx common used functions
 ***********************************************************************************************************/
DWORD	hashSetting( LPCSTR szStr );

static __inline BYTE ColumnType( BYTE b ) {

	switch( b ) {
		case 1: return EXTRA_ICON_ADV1;
		case 2: return EXTRA_ICON_ADV2;
		case 3: return EXTRA_ICON_ADV3;
		case 4: return EXTRA_ICON_ADV4;
	}
	return 0;
}

static __inline BOOL IsProtoOnline( LPSTR szProto )
{
	return szProto && szProto[0] && CallProtoService( szProto, PS_GETSTATUS, NULL, NULL ) >= ID_STATUS_ONLINE;
}